{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import os\n", "import math\n", "import copy" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(178, 14)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('normalizedwinedata.csv', header=None)\n", "df.shape" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "label = df.iloc[:, 0]\n", "axis = df.iloc[:, 1 : ]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(178, 13)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "axis.shape" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def initialCentroid(x, k):\n", " c_id = [np.random.choice(np.arange(len(x)))] # 第一个簇中心序号\n", " k -= 1\n", " while k > 0:\n", " dis = np.zeros(shape=(len(c_id), len(x)))\n", " for i in range(len(c_id)):\n", " dis[i] = np.sum(np.square(x - x[c_id[i]]), axis=1)\n", " min_dis = np.min(dis, axis=0)\n", " min_dis = min_dis / np.sum(min_dis)\n", " ind = np.random.choice(np.arange(len(x)), p=min_dis.ravel())\n", " k -= 1\n", " c_id.append(ind)\n", " return c_id" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.array([[1,2,3],[2,3,4]])\n", "np.min(a, axis=0)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "axis = np.array(axis, dtype=np.float32)\n", "c_id = initialCentroid(axis, 3)\n", "c_axis = axis[c_id]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# axis是所有点坐标,center是k个聚类中心的坐标\n", "def diff(x, new_x):\n", " return np.sum(np.sqrt(np.sum(np.square(x - new_x), axis=1)))\n", "\n", "def kmeans(axis, center, k, epsilon):\n", " dis = np.zeros(shape=(k, len(axis)), dtype=np.float32)\n", " for i in range(k):\n", " dis[i] = np.sum(np.square(axis - center[i]), axis=1)\n", " belong = np.array([np.argmin(np.array(dis[:, i])) for i in range(dis.shape[1])], dtype=np.int32)\n", " new_center = np.zeros(shape=center.shape, dtype=np.float32)\n", " for i in range(len(belong)):\n", " new_center[belong[i]] += axis[i]\n", " for i in range(k):\n", " new_center[i] = new_center[i] / np.sum(np.array(belong == i, dtype=np.int))\n", " while diff(new_center, center) > epsilon:\n", " for i in range(k):\n", " dis[i] = np.sum(np.square(axis - new_center[i]), axis=1)\n", " belong = np.array([np.argmin(np.array(dis[:, i])) for i in range(dis.shape[1])])\n", " center = copy.deepcopy(new_center)\n", " new_center = np.zeros(shape=center.shape, dtype=np.float32)\n", " for i in range(len(belong)):\n", " new_center[belong[i]] += axis[i]\n", " for i in range(k):\n", " new_center[i] = new_center[i] / np.sum(np.array(belong == i, dtype=np.int))\n", " return belong, new_center" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "belong, new_center = kmeans(axis, c_axis, 3, 1e-10)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "48.985415041446686\n" ] } ], "source": [ "err = 0\n", "for i in range(len(axis)):\n", " err += np.sum(np.square(axis[i] - new_center[belong[i]]))\n", "print(err)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "for i in range(len(belong)):\n", " if belong[i] == 2:\n", " belong[i] = 1\n", " elif belong[i] == 1:\n", " belong[i] = 2\n", " else:\n", " belong[i] = 3\n", " " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'np' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0macc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msum\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbelong\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mlabel\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbelong\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0macc\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 'np' is not defined" ] } ], "source": [ "acc = np.sum(belong == label) / len(belong)\n", "print(acc)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1,\n", " 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2], dtype=int64)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "belong" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "def draw(x, y, axis, center, belong):\n", " color = ['r', 'b', 'g']\n", " # center[0], center[1] = center[1], center[0]\n", " for i in range(len(axis)):\n", " plt.scatter(axis[i][x], axis[i][y], c=color[belong[i] - 1], marker='o')\n", " plt.scatter(center[2][x], center[2][y], c='r', s=140, marker='*', label='cluster center1')\n", " plt.scatter(center[1][x], center[1][y], c='b', s=140, marker='*', label='cluster center2')\n", " plt.scatter(center[0][x], center[0][y], c='g', s=140, marker='*', label='cluster center3')\n", " plt.legend(fontsize=8, loc='upper right')\n", " plt.show()\n", " return None\n" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "draw(0, 1, axis, new_center, belong)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "ans_df = pd.DataFrame({'Order' : np.arange(1, len(axis) + 1),\n", " 'label' : belong})\n", "ans_df.to_csv('label.csv', index=None)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "with open('Measurement.txt', 'w') as f:\n", " f.write('Accuracy: ' + str(acc) + '\\n')\n", " f.write('Total square distance: ' + str(err))\n", "f.close()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "73e8fb81fc9d21637ba62ed4f9412d39843bbeeb61edb8163afd2f9314d52c65" }, "kernelspec": { "display_name": "Python 3.7.6 64-bit (system)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }